package com.gxc.queue;

import java.util.LinkedList;
import java.util.Queue;

/**
 * 实现一种猫狗队列的结构，要求如下：
 * 用户可以调用 add 方法将cat类或dog类的实例放入队列中；
 * 用户可以调用 pollAll 方法，将队列中所有的实例按照进队列的先后顺序依次弹出；
 * 用户可以调用 pollDog 方法，将队列中dog类的实例按照进队列的先后顺序依次弹出；
 * 用户可以调用 pollCat 方法，将队列中cat类的实例按照进队列的先后顺序依次弹出；
 * 用户可以调用 isEmpty 方法，检查队列中是否还有dog或cat的实例；
 * 用户可以调用 isDogEmpty 方法，检查队列中是否有dog类的实例；
 * 用户可以调用 isCatEmpty 方法，检查队列中是否有cat类的实例。
 */
public class DogAndCat {

    private Queue<PetEnterQueue> dogQ;
    private Queue<PetEnterQueue> catQ;
    //代替时间戳
    private long count;

    public DogAndCat() {
        this.dogQ = new LinkedList<>();
        this.catQ = new LinkedList<>();
    }

    public void add(Pet pet) {
        PetEnterQueue petEnterQueue = new PetEnterQueue(pet, this.count++);
        if (pet.getType().equals(Dog.DOG)) {
            dogQ.add(petEnterQueue);
        } else if (pet.getType().equals(Cat.CAT)) {
            catQ.add(petEnterQueue);
        } else {
            throw new RuntimeException("error type");
        }
    }

    public Pet pollAll(){
        if (!dogQ.isEmpty() && !catQ.isEmpty()) {
            if (dogQ.peek().getCount()<catQ.peek().getCount()) {
                return dogQ.poll().getPet();
            } else {
                return catQ.poll().getPet();
            }
        } else if (!dogQ.isEmpty()) {
            return dogQ.poll().getPet();
        } else if (!catQ.isEmpty()) {
            return catQ.poll().getPet();
        } else {
            throw new RuntimeException("queue is empty");
        }
    }

    public Dog pollDog(){
        if (!dogQ.isEmpty()) {
            return (Dog) dogQ.poll().getPet();
        } else {
            throw new RuntimeException("queue is empty");
        }
    }

    public Cat pollCat(){
        if (!catQ.isEmpty()) {
            return (Cat) catQ.poll().getPet();
        } else {
            throw new RuntimeException("queue is empty");
        }
    }

    public boolean isEmpty(){
        return dogQ.isEmpty() && catQ.isEmpty();
    }

    public boolean isDogEmpty(){
        return dogQ.isEmpty();
    }

    public boolean isCatEmpty(){
        return catQ.isEmpty();
    }
}


